package com.thitech.sif.interceptor;

import com.thitech.sif.AbsOutput;
import com.thitech.sif.Executor;

/**
 * <pre>
 * 各种服务执行期间拦截器接口
 * 
 * 用于在服务执行前后添加一些公共操作，所有拦截器都应实现此接口，并在Template类中添加拦截器链，有一些拦截器会有顺序，如：如果拦截器中有服务调用
 * 日志的拦截器，则该拦截器应该放在第一个，因为服务调用日志中会输出原交易用过的流水号
 * </pre>
 * 
 * @author shisheng.lian
 * @date 2014-04-02
 *
 */
public interface InterceptorHandler {

	/**
	 * 拦截器初始化，该方法会在拦截器执行时第一时间允许，可以此方法中放置一些拦截器的初始化工作
	 */
	public void init();
	
	/**
	 * 拦截器销毁方法，该方法会在拦截器所有方法执行完成后执行，可做一些销毁的工作
	 */
	public void destroy();
	
	/**
	 * 服务执行前调用该方法，如果在方法中判断出服务不应该执行，则方法返回false，否则返回true
	 * @param executor
	 * 				服务执行器，包含所有被调用服务相关的数据
	 * @return 返回true，则继续执行下一个拦截器，返回false则直接返回停止执行后面的拦截器链
	 * @throws Exception
	 * 				当前拦截器出现异常时抛出
	 */
	public boolean beforeInvoke(Executor executor) throws Exception;
	
	/**
	 * 服务执行后调用该方法，无返回值，只对服务返回结果做处理
	 * @param executor
	 * 				服务执行器，包含所有被调用服务相关的数据
	 * @param e
	 * 				执行过程中出现的异常信息
	 * @throws Exception
	 * 				当前拦截器出现异常时抛出
	 */
	public void afterInvoke(Executor executor, AbsOutput output, Throwable e) throws Exception;
}
